package com.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/**
 * @author U 自定滑动按钮
 */
public class SlidingButton extends View {

	private boolean mChecked;
	private Bitmap mSbBgBitmap;
	private Bitmap mSbBtnBitmap;
	private Paint mPaint;
	private float offset;
	private float mDonwX;
	private int mMaxOffset;

	public SlidingButton(Context context) {
		this(context, null);
	}

	public SlidingButton(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public SlidingButton(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		// BitmapFactory.decodeResource(getResources(),
		// R.drawable.slide_button_background)
		// 获取资源的id
		mMaxOffset = mSbBgBitmap.getWidth() - mSbBtnBitmap.getWidth();
		mPaint = new Paint();

		setCheck();
	}

	// 设置默认是是否开启
	private void setCheck() {
		if (mChecked) {
			offset=mMaxOffset;
		} else {
			offset=0;
		}
		invalidate();
	}

	// 测量
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		// 给自己设置了大小
		setMeasuredDimension(mSbBgBitmap.getWidth(), mSbBgBitmap.getHeight());
	}

	// 绘制
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		canvas.drawBitmap(mSbBgBitmap, 0, 0, mPaint);
		canvas.drawBitmap(mSbBtnBitmap, offset, 0, mPaint);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			mDonwX = event.getX();
			break;
		case MotionEvent.ACTION_MOVE:
			float moveX = event.getX();
			int dx = (int) (moveX - mDonwX + 0.5f);
			offset += dx;
			// 处理左右边界问题
			// 左边界进行处理
			if (offset < 0) {
				offset = 0;
			}

			// 右边界的处理
			if (offset > mMaxOffset) {
				offset = mMaxOffset;
			}
			invalidate();// ---在未来的某个时刻调用onDraw的方法，在UI线程里面，假如你在非UI线程，请调用postInvalidate
			mDonwX = moveX;
			break;
		case MotionEvent.ACTION_UP:
			// 对大于或者小于一半处理
			int halfMaxOffset = mMaxOffset / 2;
			boolean temp = offset > halfMaxOffset;// 大于一步
			if (temp) {
				offset = mMaxOffset;
				// 通知外面
				if (onSwitchListener != null && temp!=mChecked) {// 当状态不一样的情况下，才会通知外面
					// 更新check的值
					mChecked=temp;
					onSwitchListener.onSwicth(true);
				}
			} else {
				offset = 0;
				// 通知外面
				if (onSwitchListener != null && temp!=mChecked) {
					// 更新check的值
					mChecked=temp;
					onSwitchListener.onSwicth(false);
				}
			}
			invalidate();
			break;
		default:
			break;
		}
		// 结论：
		// View 的onTouchEvent return false: 只执行DOWN事件
		// View 的onTouchEvent return true:就会执行DOWN，MOVE,UP
		return true;
	}

	public OnSwitchListener onSwitchListener;

	public void setOnSwitchListener(OnSwitchListener onSwitchListener) {
		this.onSwitchListener = onSwitchListener;
	}

	public interface OnSwitchListener {
		void onSwicth(boolean isOpen);
	}

}
